#pragma once

#include "BaseObj.h"

class Pack;
class Res: public Obj
{
	Base_DeclareObj( Res, Obj);
public:



	Pack*	mPack;
	u32_t	mResID;
	SString	mName;

};


class RawBuf;

class Pack: public Obj
{
	Ins_DeclareObj( Pack, Obj);
public:

	Pack( const char* name);

	SString	mName;
	
	Res* NewRes( ClassDef* cls);
	void DelRes( Res*);
	Res* GetRes( s32_t resID);

	void Save( const char* dstPath);
	void Load();

	
	TArray< Res::Ptr > mResList;

	void InsertObj( Obj*);
	Obj* GetObj( s32_t index);

	TArray< Obj::Ptr > mObjDatas;

	void PostLoadLink();
	
	static TMap< SString, Pack::Ptr> sPackMap;
private:

	struct OutpackResLink
	{
		Pack*		OwnerPack;
		s32_t		ResIndex;
		
		P(Res)*		ResPtr;
	};
	TArray< OutpackResLink> mOutpackLinks;

	struct InpackLink
	{
		P(Obj)*		ObjPtr;
		s32_t		LinkID;
	};

	TArray< InpackLink> mInpackLinks;
	
	void _writeRaw( void* data, s32_t count);
	void _readRaw( void* data, s32_t count);

	void _writeString( const char* data);
	ds_t _readString();

	// write
	void _regLinkObj( Obj* obj);
	void _writeObj( Obj* obj);
	TArray< Obj::Ptr> mStreamObjList;
	void _writeProp( PropData& data);
	bool mIsSaveing;

	// read
	Obj* _readObj();
	void _readProp( PropData& data);

	Ogre::DataStreamPtr mDataStream;
	s32_t _freeResSlot();
};


